package utils

import (
	"fmt"
	"strings"
)

type FamilyAccount struct {
	//声明必要的字段
	account string
	pwd     string
	key     string
	loop    bool
	balance float64
	money   float64
	note    string
	details string
	flag    bool
	isLogin bool
}

// 编写一个工程模式的构造方法，返回一个*FamilyAccount实例
func NewFamilyAccount() *FamilyAccount {
	return &FamilyAccount{
		account: "tang",
		pwd:     "888",
		key:     "",
		loop:    true,
		balance: 10000.0,
		money:   0.0,
		note:    "",
		flag:    false,
		details: "变动方式\t账户余额\t收支金额\t收入说明",
		isLogin: false,
	}
}

// 登录方法
func (familyAccount *FamilyAccount) login() {
	if !familyAccount.isLogin {
		fmt.Println()
		fmt.Println()
		inputAcc := ""
		inputPwd := ""
		for {
			fmt.Println("请输入账号")
			fmt.Scanln(&inputAcc)
			fmt.Println("请输入密码")
			fmt.Scanln(&inputPwd)
			if familyAccount.account != inputAcc || familyAccount.pwd != inputPwd {
				fmt.Println("账号或密码输入错误，请重新登录")
				continue
			}
			familyAccount.isLogin = true
			break
		}
	}
}

// 退出登录方法
func (familyAccount *FamilyAccount) logout() {
	if !familyAccount.isLogin {
		fmt.Println("未登录，无法退出登录")
		return
	}
	familyAccount.isLogin = false
}

// 将显示明细写到一个方法中
func (familyAccount *FamilyAccount) showDetails() {
	fmt.Println()
	fmt.Println()
	fmt.Println("----------当前收支明细记录----------")
	if !familyAccount.flag {
		fmt.Println("当前没有收支明细请来一笔吧...")
		// break
	} else {
		fmt.Println(familyAccount.details)
	}
	fmt.Println()
	fmt.Println()
}

// 将登记收入写成一个方法
func (familyAccount *FamilyAccount) income() {
	fmt.Println()
	fmt.Println()
	fmt.Println("请输入本次收入金额：")
	fmt.Scanln(&familyAccount.money)
	familyAccount.balance += familyAccount.money
	fmt.Println("请输入本次收入原因：")
	fmt.Scanln(&familyAccount.note)
	familyAccount.details += fmt.Sprintf("\n收入\t%v\t%v\t%v\n", familyAccount.balance, familyAccount.money, familyAccount.note)
	familyAccount.flag = true
}

// 将登记支出写成一个方法
func (familyAccount *FamilyAccount) pay() {
	fmt.Println()
	fmt.Println()
	fmt.Println("请输入本次支出金额：")
	fmt.Scanln(&familyAccount.money)
	if familyAccount.money > familyAccount.balance {
		fmt.Println("支出的金额不足，不能支出")
		// break
	} else {
		familyAccount.balance -= familyAccount.money
		fmt.Println("请输入本次支出原因：")
		fmt.Scanln(&familyAccount.note)
		familyAccount.details += fmt.Sprintf("\n支出\t%v\t%v\t%v\n", familyAccount.balance, familyAccount.money, familyAccount.note)
		familyAccount.flag = true
	}
	fmt.Println()
	fmt.Println()
}

// 转账方法
func (familyAccount *FamilyAccount) transfer() {
	fmt.Println()
	fmt.Println()
	fmt.Println("请输入本次转账金额:")
	fmt.Scanln(&familyAccount.money)
	if familyAccount.money > familyAccount.balance {
		fmt.Println("转账的金额不足，不能转账")
		// break
	} else {
		familyAccount.balance -= familyAccount.money
		fmt.Println("请输入本次转账原因：")
		fmt.Scanln(&familyAccount.note)
		familyAccount.details += fmt.Sprintf("\n转账\t%v\t%v\t%v\n", familyAccount.balance, familyAccount.money, familyAccount.note)
		familyAccount.flag = true
	}
	fmt.Println()
	fmt.Println()
}

// 将退出系统写成一个方法
func (familyAccount *FamilyAccount) exit() {
	fmt.Println()
	fmt.Println()
	fmt.Println("你确定要退出吗 y/n")
	confirmExit := ""
	for {
		fmt.Scanln(&confirmExit)
		//忽略大小写比较
		if strings.EqualFold(confirmExit, "y") || strings.EqualFold(confirmExit, "n") {
			break
		} else {
			fmt.Println("输入有误,请重新输入")
		}
	}
	if strings.EqualFold(confirmExit, "y") {
		familyAccount.loop = false
	} else {
		fmt.Println()
		fmt.Println()
	}
}

// 显示主菜单
func (familyAccount *FamilyAccount) MainMenu() {
	for {
		if !familyAccount.isLogin {
			fmt.Println("请您先登录...")
			familyAccount.login()
		}
		fmt.Println("正在进入主界面...")
		fmt.Println("-----------家庭收支明细-----------")
		fmt.Println("          1.收支明细")
		fmt.Println("          2.登记收入")
		fmt.Println("          3.登记支出")
		fmt.Println("          4.转出余额")
		fmt.Println("          5.退出登录")
		fmt.Println("          6.退出软件")
		fmt.Println("请选择(1-5)")
		fmt.Scanln(&familyAccount.key)
		switch familyAccount.key {
		case "1":
			familyAccount.showDetails()
		case "2":
			familyAccount.income()
		case "3":
			familyAccount.pay()
		case "4":
			familyAccount.transfer()
		case "5":
			familyAccount.logout()
		case "6":
			familyAccount.exit()
		default:
			fmt.Println("请输入正确的选项")
			fmt.Println()
			fmt.Println()
		}
		if !familyAccount.loop {
			break
		}
	}
	fmt.Println("您已退出家庭收支明细系统...")
}
